#include <iostream>

using namespace std;

/**
 *  虚继承
 *    多继承的情况, 一个子类继承了多个父类, 存在一个间接基类 GrandFather
 *    在 创建子类对象的时候如果不使用虚继承, 那么这个间接基类就会执行两次
 *    构造和析构函数. 解决办法是在 继承的位置加上 一个 virtual 就代表
 *    虚继承.
 */


class GrandFather {
public:
    GrandFather() {
        cout << "爷爷类的构造函数" << endl;
    }

    ~GrandFather() {
        cout << "爷爷类的析构函数" << endl;
    }

};

class Father : virtual public GrandFather { // Father 虚继承自 Grandfather
public:
    Father() {
        cout << "父亲类的构造函数" << endl;
    }

    ~Father() {
        cout << "父亲类的构造函数" << endl;
    }

};


class Mother : virtual public GrandFather {
public:
    Mother() {
        cout << "母亲类的构造函数" << endl;
    }
    ~Mother() {
        cout << "母亲类的析构函数" << endl;
    }
};


class Children : public Father, public Mother {
public:
    Children() {
        cout << "子类的构造函数" << endl;
    }

    ~Children() {
        cout << "子类的析构函数" << endl;
    }
};

int main() {

    Children me;

    return 0;
}
